package cn.highedu.spring;

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

/**
 * 测试类
 */
public class SpringTest {
    private ApplicationContext context; // Spring容器对象
    @BeforeEach
    public void createContext() {
        // 加载Spring管理类 创建Spring容器对象
        context = new AnnotationConfigApplicationContext(ContextConfig.class);
    }

    @Test
    public void test1() {
        // 当类中使用@Scope("prototype")之后 当前类的对象在使用的时候才会去创建并初始化
        TagService tagService = context.getBean("tagService", TagService.class);
        // 调用具体的业务方法
        tagService.getTags().forEach(System.out::println);
        tagService.getTags().forEach(System.out::println);
        tagService.getTags().forEach(System.out::println);
        TagService tagService1 = context.getBean("tagService", TagService.class);
        // 关闭Spring容器 (关闭容器的顺序：先调用被@PreDestroy标记的方法,然后销毁对象,最后关闭容器)
        ((AnnotationConfigApplicationContext)context).close();
    }

    // 测试Java虚拟机的钩子程序
    @Test
    public void testHook() throws InterruptedException {
        /**
         * runtime 表示正在运行的Java虚拟机
         * 可以获取虚拟机的参数
         */
        Runtime runtime = Runtime.getRuntime();

        // 获取当前虚拟机的总内存
        long bytes = runtime.totalMemory();
        System.out.println("当前JVM总内存:" + bytes/1024/1024 + "MB");
        // 让JVM挂上钩子(钩子程序是一个线程) 在JVM结束关闭之前执行钩子程序
        runtime.addShutdownHook(new Thread(() -> System.out.println("执行钩子程序")));

        System.out.println("完成了钩子程序");
        Thread.sleep(2000);
    }

    @Test
    public void test2() {
        // 获取对象
        ThirdPartyClass thirdPartyClass = context.getBean("thirdPartyClass", ThirdPartyClass.class);

        // 销毁Spring容器
        ((AnnotationConfigApplicationContext)context).close();
    }

    @Test
    public void test3() {

    }
}
